﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOPregunta : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOPregunta instance = null;  
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.PreguntaDataTable PreguntaTabla = new DataSetConsultora.PreguntaDataTable();
        private PreguntaTableAdapter PreguntaTableAdapter = new PreguntaTableAdapter();
        // Dependencias de otros DAOs
        private DAORespuesta miDAORespuesta = DAORespuesta.Instance;
        // Caches
        private Pregunta cacheUna;

        public static DAOPregunta Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOPregunta();
                        }
                    }
                }
                return instance;
            }
        }

        public Pregunta guardar(Pregunta unaPregunta, int id_factor, int id_respuesta)
        {

            // Inserto la pregunta en la db por medio del table adapter
            PreguntaTableAdapter.Insertar(unaPregunta._nombre, unaPregunta._pregunta, unaPregunta._descripcion, id_factor, id_respuesta);
            
            // Devuelvo la insercion
            return recolectarUno();
        }

        public void actualizar(Pregunta unaPregunta)
        {

            // Actualizo la pregunta en la db pro medio de su table adapter
            PreguntaTableAdapter.Actualizar(unaPregunta._nombre, unaPregunta._pregunta, unaPregunta._descripcion, unaPregunta._cod_pregunta);

        }

        public List<Pregunta> cargar(){

            // Cargo los Pregunta de la db
            PreguntaTabla = PreguntaTableAdapter.GetData();
            
            // Finalmente devuelvo la lista de PreguntasCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<Pregunta> cargar(Int32 cod_Factor)
        {   // obtengo la empresa por id en empresaTabla
            PreguntaTabla = PreguntaTableAdapter.consultarPor(cod_Factor);

            // Finalmente devuelvo la lista de PreguntasCargados, recolectadas por la funcion            
            return recolectar();
        }

        public Pregunta cargarUna(int unId)
        {

            // Si no tengo una Opcion de respuesta
            if (cacheUna == null)
            {
                // obtengo la Pregunta por id en  PreguntTabla
                PreguntaTabla = PreguntaTableAdapter.consultarPorId(unId);
                // Finalmente retorno un nuevo objeto Pregunta mapeado de la tabla    
                return recolectarUno();

            }
            // Si tengo una Opcion de respuesta
            else
            {
                // Solo retorno la preguta cacheada, evito ciclos y tener quer ir a la db
                return cacheUna;
            }


        }

        public Pregunta recolectarUno()
        {

            // Cacheo la pregunta para a futuro evitar ciclos en el modelo
            cacheUna = new Pregunta(PreguntaTabla[0].id,
                                PreguntaTabla[0].nombre,
                                PreguntaTabla[0].pregunta,
                                PreguntaTabla[0].descripcion);
            
            // Devuelvo una unica pregunta mapeada de la tabla
            return cacheUna;


        }

        private List<Pregunta> recolectar(){

            // Creo la lista para recolectar y devolver los Preguntas cargados de la db
            List<Pregunta> PreguntasCargados = new List<Pregunta>();

            // Recorro los Preguntas de la tabla
            foreach (DataSetConsultora.PreguntaRow unaPreguntaFila in PreguntaTabla)
            {

                Pregunta nuevaPregunta = new Pregunta(unaPreguntaFila.id,
                                                   unaPreguntaFila.nombre,
                                                   unaPreguntaFila.pregunta,
                                                   unaPreguntaFila.descripcion);

                nuevaPregunta._respuesta = miDAORespuesta.cargar(unaPreguntaFila.Respuestacod_respuesta, nuevaPregunta);

                // Creo un Pregunta y lo agrego a la lista de Preguntas cargados
                PreguntasCargados.Add(nuevaPregunta);

            }

            return PreguntasCargados;
        }
    }
}
